<?php
class MvcCarcassTest extends PHPUnit_Framework_TestCase {

    // Так примерно выглядят правила для каркасов
    private $_testRules = array (
        '/^[\/]?admin\//iU' => array (
            'CARCASS_FILE' => 'admin.tpl',
            'MVC_NODES'    => array (
                array('controller_test_1', 'method_test_1', 'param'),
                array('controller_test_2', 'method_test_2', 'param'),
                array(MVC_Carcass::MAIN_REQUEST_ID),
                array('controller_test_3', 'method_test_3', 'param'),
                array('controller_test_4', 'method_test_4', 'param'),
            )
        ),
        '/.*/' => array (
            'CARCASS_FILE' => 'main.tpl',
            'MVC_NODES'    => array (
                array('controller_test_5', 'method_test_5', 'param'),
                array('controller_test_6', 'method_test_6', 'param'),
                array(MVC_Carcass::MAIN_REQUEST_ID),
                array('controller_test_7', 'method_test_7', 'param'),
                array('controller_test_8', 'method_test_8', 'param'),
            )
        )
    );


    // Так выглядит выделенный для дальнейшей обработки список узлов MVC
    private $_testMvcNodes =  array(
        '<!--@controller_test_5/method_test_5/param -->' => array(
            'controller_test_5',
            'method_test_5',
            array('param')
         ),
        '<!--@controller_test_6/method_test_6/param -->' => array(
            'controller_test_6',
            'method_test_6',
            array('param')
         ),
        '<!--@::main_request:: -->' => array('::main_request::'),
        '<!--@controller_test_7/method_test_7/param -->' => array(
            'controller_test_7',
            'method_test_7',
            array('param')
         ),
        '<!--@controller_test_8/method_test_8/param -->' => array(
            'controller_test_8',
            'method_test_8',
            array('param')
         )
     );



    // Так должен выглядеть массив после выполения всех mvc-узлов
    // Этот массив, должен генерироваться в цикле обработки запроса
    private $_testMvcNodesResult =  array(
        '<!--@controller_test_5/method_test_5/param-->' => '<!-- html-код тега head -->',
        '<!--@controller_test_6/method_test_6/param-->' => '<!-- html-код меню -->',
        '<!--@::main_request::-->'                      => '<!-- html-код целевого запроса -->',
        '<!--@controller_test_7/method_test_7/param-->' => '<!-- html-код комментариев -->',
        '<!--@controller_test_8/method_test_8/param-->' => '<!-- html-код подвала -->'
     );

    // Определен в конструкторе
    private $_carcassContent = '';

    private $_carcassResult = '';

    const TEST_CARCASS_FOLDER = '/opt/http/cms736/trunk/carcass/';
    const TEST_ANY_REQUEST    = 'any/any/any';
    const TEST_ADMIN_REQUEST = 'admin/index';


    public function __construct($name = NULL, array $data = array(), $dataName = '') {
        parent::__construct($name, $data, $dataName);
        // Так выглядят сами каркасы HTML - страниц
        $this->_carcassContent = <<<CARCASS
<!DOCTYPE html>
<head>
  <!--@controller_test_5/method_test_5/param-->
</head>
<body>
  <div class="c-menu">
    <!--@controller_test_6/method_test_6/param-->
  </div>
  <div class="c-content">
    <!--@::main_request::-->
  </div class="c-comments">
  <div>
    <!--@controller_test_7/method_test_7/param-->
  </div>
  <div>
    <!--@controller_test_8/method_test_8/param-->
  </div>
</body>
CARCASS;
        // Так выглядит каркас после обработки
        $this->_carcassResult = <<<CARCASS
<!DOCTYPE html>
<head>
  <!-- html-код тега head -->
</head>
<body>
  <div class="c-menu">
    <!-- html-код меню -->
  </div>
  <div class="c-content">
    <!-- html-код целевого запроса -->
  </div class="c-comments">
  <div>
    <!-- html-код комментариев -->
  </div>
  <div>
    <!-- html-код подвала -->
  </div>
</body>
CARCASS;
    }


    private function _createCarcassMock ($request) {
        $objCarcassMock = $this->getMock(
            'MVC_Carcass',
            array('readCarcass'),
            array(self::TEST_CARCASS_FOLDER, $request, $this->_testRules)
        );

        $objCarcassMock->expects($this->any())
                       ->method('readCarcass')
                       ->will($this->returnValue($this->_carcassContent));

        return $objCarcassMock;
    }


    public function testCreateCarcassMock_SetBasicSettings () {
        $objCarcassMock = $this->_createCarcassMock(self::TEST_ANY_REQUEST);

        $this->assertEquals(self::TEST_CARCASS_FOLDER, $objCarcassMock->getCarcassFolder());
        $this->assertEquals(self::TEST_ANY_REQUEST, $objCarcassMock->getMainRequest());
        $this->assertEquals($this->_testRules, $objCarcassMock->getCarcassRules());
    }


    public function testCreateCarcassMock_InitializationSettings () {
        $objCarcassMock = $this->_createCarcassMock(self::TEST_ANY_REQUEST);

        $this->assertEquals($this->_testRules['/.*/'], $objCarcassMock->getSettings());
    }


    public function testCreateCarcassMock_MakeSettingsByRequest () {
        $objCarcassMock = $this->_createCarcassMock(self::TEST_ADMIN_REQUEST);

        $this->assertEquals($this->_testRules['/^[\/]?admin\//iU'], $objCarcassMock->getSettings());
    }

    public function testGetCarcassFile () {
        $objCarcassMock = $this->_createCarcassMock(self::TEST_ANY_REQUEST);

        $this->assertEquals('/opt/http/cms736/trunk/carcass/main.tpl', $objCarcassMock->getCarcassFile());
    }


    public function testGetCarcass () {
        $objCarcassMock = $this->_createCarcassMock(self::TEST_ANY_REQUEST);

        $this->assertEquals($this->_carcassContent, $objCarcassMock->getCarcass());
    }


    public function testGetMvcNodes () {
        $objCarcassMock = $this->_createCarcassMock(self::TEST_ANY_REQUEST);

        $this->assertEquals($this->_testMvcNodes, $objCarcassMock->getMvcNodes());
    }


    public function testParse () {
        $objCarcassMock = $this->_createCarcassMock(self::TEST_ANY_REQUEST);

        $this->assertEquals($this->_carcassResult, $objCarcassMock->parse($this->_testMvcNodesResult));
    }
}